// 中间件，校验前端传递的参数
const {getUserInfo} = require('../service/user.service');

const bcrypt = require('bcryptjs');

const {userFormatError, userNameAlreadyUsed, registerError, userNameNotFound, loginError, passwordWrong} = require('../constant/err.type');

const userValidator = async (ctx, next) => {
    let {user_name, password} = ctx.request.body;
    // 合法性合理性校验
    if (!user_name || !password) {
        ctx.app.emit('error', userFormatError, ctx);
        return;
    }
    await next();
};

// 重复用户名校验
const userNameRepeat = async (ctx, next) => {

    let {user_name} = ctx.request.body;

    try {
        // 调用service层最好都try一下
        let res = await getUserInfo({user_name});
        if (res) {
            ctx.app.emit('error', userNameAlreadyUsed, ctx);

            // 返回信息通过注册error事件，在index.js里统一处理
            // ctx.status = 409;
            // ctx.body = {
            //     code: '10002',
            //     message: '用户名已存在！',
            //     result: ''
            // };
            return;
        }

    } catch (e) {
        ctx.app.emit('error', registerError, ctx);
        return;
    }
    await next();
};

// 密码加密
const cryptPassword = async (ctx, next) => {

    let {password} = ctx.request.body;
    // 十次加盐
    let salt = bcrypt.genSaltSync(10);
    // 对密码进行加密
    let hash = bcrypt.hashSync(password, salt);

    ctx.request.body.password = hash;

    await next()
};

// 用户登录校验
const verifyLogin = async (ctx, next) => {

    // login_type 1 前台 2 后台
    let {user_name, password, login_type} = ctx.request.body;

    try {
        // 调用service层最好都try一下
        let res = await getUserInfo({user_name});

        // 是否存在该用户
        if (!res) {
            ctx.app.emit('error', userNameNotFound, ctx);
            return;
        }

        // 密码是否正确
        if (!bcrypt.compareSync(password, res.password)) {
            ctx.app.emit('error', passwordWrong, ctx);
            return;
        }

        // 是否是管理员
        if (login_type === 2 && res.is_admin !== 'TRUE') {
            ctx.app.emit('error', {
                code: '4',
                message: '您不是管理员~'
            }, ctx);
            return;
        }
    } catch (e) {
        ctx.app.emit('error', loginError, ctx);
        return;
    }
    await next();
};

module.exports = {userValidator, userNameRepeat, cryptPassword, verifyLogin};